<?php
//声明命名空间
namespace Frame;

//定义最终的框架初始类
final class Frame{
	//初始化方法
	public static function run(){
		self::initCharset();	//初始化字符集
		self::initConfig();		//初始化配置文件
		self::initRoute();		//初始化路由参数
		self::initConst();		//初始化常量目录设置
		self::initAutoLoad();	//初始化类的自动加载
		self::initDispatch();	//初始化请求分发
	}
	//私有的静态的字符集设置
	private static function initCharset(){
		header("content-type:text/html;charset=utf-8");
        //开启session会话
        session_start();
        //时区设置
        ini_set('date.timezone','Asia/Shanghai');
	}
	//私有的静态的初始化配置文件
	private static function initConfig(){
		//配置文件路径 echo APP_PATH.'Conf'.DS.'Config.php';  C:\xampp\htdocs\blog\Home\Conf\Config.php
		$GLOBALS['config'] = require_once(APP_PATH.'Conf'.DS.'Config.php'); 
	}
	//私有的静态的路由参数
	private static function initRoute(){
		$p = $GLOBALS['config']['default_platform'];//平台参数default_platform
		$c = isset($_GET['c']) ? $_GET['c'] : $GLOBALS['config']['default_controller'];//控制器参数
		$a = isset($_GET['a']) ? $_GET['a'] : $GLOBALS['config']['default_action'];//动作参数

		define("PLAT",$p);
		define("CONTROLLER",$c);
		define("ACTION",$a);
	}
	//私有的静态的设置目录常量方法
	private static function initConst(){
		//例：./Home/View 前台视图目录
		define("VIEW_PATH",APP_PATH."View".DS);
		//Frame目录
		define("FRAME_PATH",ROOT_PATH."Frame".DS);
		//Public目录
		define("PUBLIC_PATH",ROOT_PATH."Public".DS);
	}
	//私有的静态的类自动加载
	private static function initAutoLoad(){
		spl_autoload_register(function($className){
			//将命名空间路径转换成真实路径
			//命名空间 .\Home\Controller\StudentController
			//真实路径 ./Home/Controller/Student.class.php
			$fileName = ROOT_PATH.str_replace("\\",DS,$className).".class.php";
			//echo $fileName."<br>";
			//类文件存在就包含
			if(file_exists($fileName)) require_once($fileName);
		});
			//$controllerObj = .\Home\Controller\StudentController();
	}
	//私有的静态的请求分发：创建那个控制器类的对象 调用控制器对象的那个方法
	private static function initDispatch(){
		//动态构建类名 .\Home\Controller\StudentController
		$className = '\\'.PLAT.'\\'.'Controller'.'\\'.CONTROLLER.'Controller';
		//创建控制器类的对象
		$controllerObj = new $className();
		//调用控制器对象的方法
		$actionName = ACTION;
		$controllerObj->$actionName();
	}
}

